/*
 * Copyright 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.droidcon.apps.template.io.json;

import org.droidcon.apps.template.provider.ScheduleContract;
import org.droidcon.apps.template.provider.ScheduleContract.Speakers;
import org.droidcon.apps.template.provider.ScheduleContract.SyncColumns;
import org.droidcon.apps.template.util.Lists;
import org.droidcon.apps.template.util.ParserUtils;
import org.droidcon.apps.template.util.SpreadsheetEntry;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.net.Uri;
import android.text.Html;
import android.util.Log;

import java.io.IOException;
import java.util.ArrayList;

import static org.droidcon.apps.template.util.ParserUtils.queryItemUpdated;
import static org.droidcon.apps.template.util.ParserUtils.sanitizeId;
import static org.droidcon.apps.template.util.ParserUtils.AtomTags.ENTRY;
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.START_TAG;

/**
 * Handle a remote {@link XmlPullParser} that defines a set of {@link Speakers}
 * entries. Assumes that the remote source is a Google Spreadsheet.
 */
public class RemoteSpeakersHandler extends JsonHandler {
	private static final String TAG = "SpeakersHandler";
	private static final boolean DEBUG = false;

	public RemoteSpeakersHandler() {
		super(ScheduleContract.CONTENT_AUTHORITY);
	}

	/** {@inheritDoc} */
	@Override
	public ArrayList<ContentProviderOperation> parse(JsonReader reader,
			ContentResolver resolver) throws IOException {
		final ArrayList<ContentProviderOperation> batch = Lists.newArrayList();

		reader.beginObject();

		// nodes
		reader.nextName();

		reader.beginArray();
		while (reader.hasNext()) {

			reader.beginObject();

			// node
			reader.nextName();
			reader.beginObject();

			String speakerName = null;
			String uid = null;
			String company = null;
			String firstName = null;
			String lastName = null;
			String picture = null;
			String shortBio = null;
			String lastEdit = null;

			while (reader.hasNext()) {
				String name = reader.nextName();
				if (name.equals("Uid")) {
					uid = reader.nextString();
				} else if (name.equals("name")) {
					speakerName = Html.fromHtml(reader.nextString()).toString();
				} else if (name.equals("Company")) {
					company = reader.nextString();
				} else if (name.equals("First Name")) {
					firstName = reader.nextString();
				} else if (name.equals("Last Name")) {
					lastName = reader.nextString();
				} else if (name.equals("Picture")) {
					picture = reader.nextString();
				} else if (name.equals("Short Bio")) {
					shortBio = Html.fromHtml(reader.nextString()).toString();
				} else if (name.equals("lastLogin")) {
					lastEdit = reader.nextString();
				} else {
					reader.skipValue();
				}
			}
			reader.endObject();
			reader.endObject();

			final String speakerId = sanitizeId(uid, true);
			final Uri speakerUri = Speakers.buildSpeakerUri(speakerId);

			// Check for existing details, only update when changed
			final long localUpdated = queryItemUpdated(speakerUri, resolver);
			final long serverUpdated = ParserUtils.parseTimeJson(lastEdit);
			if (DEBUG) {
				Log.v(TAG, "found speaker " + uid);
				Log.v(TAG, "found localUpdated=" + localUpdated + ", server="
						+ serverUpdated);
			}
			if (localUpdated >= serverUpdated)
				continue;

			// Clear any existing values for this speaker, treating the
			// incoming details as authoritative.
			batch.add(ContentProviderOperation.newDelete(speakerUri).build());

			final ContentProviderOperation.Builder builder = ContentProviderOperation
					.newInsert(Speakers.CONTENT_URI);

			builder.withValue(SyncColumns.UPDATED, serverUpdated);
			builder.withValue(Speakers.SPEAKER_ID, speakerId);
			builder.withValue(Speakers.SPEAKER_NAME, firstName + " " + lastName);
			builder.withValue(Speakers.SPEAKER_IMAGE_URL, picture);
			builder.withValue(Speakers.SPEAKER_COMPANY, company);
			builder.withValue(Speakers.SPEAKER_ABSTRACT, shortBio);
			// builder.withValue(Speakers.SPEAKER_URL,
			// entry.get(Columns.SPEAKER_URL));

			// Normal speaker details ready, write to provider
			batch.add(builder.build());
		}

		reader.endArray();

		return batch;
	}

	/** Columns coming from remote spreadsheet. */
	private interface Columns {
		String SPEAKER_TITLE = "speakertitle";
		String SPEAKER_IMAGE_URL = "speakerimageurl";
		String SPEAKER_COMPANY = "speakercompany";
		String SPEAKER_ABSTRACT = "speakerabstract";
		String SPEAKER_URL = "speakerurl";

		// speaker_title: Aaron Koblin
		// speaker_image_url: http://path/to/image.png
		// speaker_company: Google
		// speaker_abstract: Aaron takes social and infrastructural data and
		// uses...
		// speaker_url: http://profiles.google.com/...

	}
}
